package com.ymh.spring.aspectj;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class Audience {

	/**
	 * 
	 * <h4>功能：定义命名的切点</h4> <h5>日期：2017年11月7日 下午5:49:32</h5> <h5>作者：Aivin</h5>
	 */
	@Pointcut(value = "execution( * * concert.Performance.perform(..))")
	public void performance() {
	}

	/**
	 * 
	 * <h4>功能：表演之前</h4> <h5>日期：2017年11月7日 下午5:39:06</h5> <h5>作者：Aivin</h5>
	 */
	@Before(value = "execution( * * concert.Performance.perform(..))")
	public void silenceCellphones() {
		System.out.println("Silencing cell phones");
	}

	/**
	 * 
	 * <h4>功能：表演之前</h4> <h5>日期：2017年11月7日 下午5:41:58</h5> <h5>作者：Aivin</h5>
	 */
	@Before(value = "execution( * * concert.Performance.perform(..))")
	public void takeSeats() {
		System.out.println("Take seats");
	}

	/**
	 * 
	 * <h4>功能：表演之后</h4> <h5>日期：2017年11月7日 下午5:44:00</h5> <h5>作者：Aivin</h5>
	 */
	@AfterReturning(value = "execution( * * concert.Performance.perform(..))")
	public void applause() {
		System.out.println("CLAP CLAP CLAP!!!");
	}

	/**
	 * 
	 * <h4>功能：表演失败之后</h4> <h5>日期：2017年11月7日 下午5:46:20</h5> <h5>作者：Aivin</h5>
	 */
	@AfterThrowing(value = "execution( * * concert.Performance.perform(..))")
	public void demandRefund() {
		System.out.println("Demanding a refund");
	}

	/**
	 * 
	 * <h4>功能：环绕通知方法</h4> <h5>日期：2017年11月7日 下午6:13:29</h5> <h5>作者：Aivin</h5>
	 * 
	 * @param pjp
	 */
	@Around(value = "performance")
	public void watchPerformance(ProceedingJoinPoint pjp) {
		try {
			System.out.println("Silencing cell phones");
			System.out.println("Take seats");
			pjp.proceed();
			System.out.println("CLAP CLAP CLAP!!!");
		} catch (Throwable e) {
			System.out.println("Demanding a refund");
		}
	}

}
